﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;
using System.Data.Objects;
using SCEM.CompraProdutos;

namespace SCEM.DTO
{
    [DataContract]
    public class OrdemCompraEquipamentoDTO : IDTO<OrdemCompraEquipamento>
    {
        [DataMember]
        public string Id { get; set; }
        [DataMember]
        public DateTime DataCadastro { get; set; }
        [DataMember]
        public DateTime DataAlteracao { get; set; }
        [DataMember]
        public string EquipamentoId { get; set; }
        [DataMember]
        public string AutorizacaoFinanceiro { get; set; }
        [DataMember]
        public StatusOrdemCompra Status { get; set; }
        [DataMember]
        public string Observacao { get; set; }
        [DataMember]
        public decimal Preco { get; set; }

        public OrdemCompraEquipamento ConvertToEntity(ObjectContext context)
        {
            OrdemCompraEquipamento ordemCompra = new OrdemCompraEquipamento();
            SCEMContainer scemContext = (SCEMContainer)context;
            Guid guid;
            Guid guidEquipamento;

            // Verifica se o DTO representa uma Ordem de Compra de Equipamento já existente
            if (!String.IsNullOrEmpty(Id) && Guid.TryParse(Id, out guid))
            {
                var queryOrdemCompra = from c in scemContext.OrdensCompraEquipamento
                                       where c.Id == guid
                                       select c;
                if (queryOrdemCompra.Count() == 1) // Usa a entidade já existente
                    ordemCompra = queryOrdemCompra.First();
            }

            // Tratar corretamente o caso de o DTO ser uma nova entidade a ser persistida
            if (ordemCompra.Id == Guid.Empty || ordemCompra.DataCadastro == DateTime.MinValue)
            {
                ordemCompra.Id = Guid.NewGuid();
                ordemCompra.DataCadastro = DateTime.Now;
                ordemCompra.DataAlteracao = DateTime.Now;
                ordemCompra.Ativo = true;
            }

            // Trata o equipamento associado
            if (!String.IsNullOrEmpty(EquipamentoId) && Guid.TryParse(EquipamentoId, out guidEquipamento))
            {
                // Para nova ordem de compra busca-se o Equipamento no banco
                var queryEquipamento = from e in scemContext.Equipamentos
                                       where e.Id == guidEquipamento
                                       select e;

                if (queryEquipamento.Count() == 1)
                    ordemCompra.Equipamento = queryEquipamento.First();
            }

            ordemCompra.Ativo = true;
            if (AutorizacaoFinanceiro != null)
                ordemCompra.AutorizacaoFinanceiro = AutorizacaoFinanceiro;
            ordemCompra.Status = (int)Status;
            ordemCompra.Observacao = Observacao;
            ordemCompra.Preco = Preco;
            return ordemCompra;
        }
    }
}
